/**
 * 群体封印技能计算
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} skill_name 
 */
export function computing_batch_seal_skill(fight_data, src_unit, target_unit, skill_name, skill_level, consummer = true) {
    console.debug(`群体封印技能计算 => 编号: ${src_unit["编号"]} 类型: ${src_unit["类型"]} 气血: ${src_unit["气血"]} 目标编号: ${target_unit["编号"] ? target_unit["编号"] : "无"} 技能：${skill_name}`);

    if (skill_level === undefined) {
        skill_level = G.FightUnitUtils.get_unit_skill_level(src_unit, skill_name);
    }
    let skill_data = G.SkillData.default[skill_name];
    if (skill_data["指定对象"] === "自己") {
        target_unit = src_unit;
    }

    let target_count = 1;

    if (skill_data["目标"]) {
        target_count = skill_data["目标"](fight_data, src_unit, target_unit, skill_level);
    } {
        console.debug(`群体封印技能 ${skill_name} 未定义目标计算`);
    }

    if (src_unit["额外目标数"]) {
        target_count += src_unit["额外目标数"];
    }

    if (target_count === 0) {
        console.debug(`群体封印技能 ${skill_name} 目标数为零，跳过计算 `);
        return;
    }

    let target_list = [];

    if (skill_data["指定目标"]) {
        target_list = skill_data["指定目标"](fight_data, src_unit, target_unit, target_count);
    } else {
        target_list = G.FightUtils.get_enemy_team_group_survive_unit(fight_data, src_unit, target_unit, target_count);
    }

    if (target_list.length === 0) {
        console.debug(`群体封印技能 ${skill_name} 获取技能目标数为零，跳过计算 `);
        return;
    }
    target_count = target_list.length;

    if (consummer) {
        // 获取技能消耗数据
        let consummer_value = 0;
        let consummer_type = "";
        if (skill_data && skill_data["消耗"]) {
            let res = skill_data["消耗"](fight_data, src_unit, 1);
            if (res) {
                consummer_value = res[0];
                consummer_type = res[1];
            }
        }
        // 如果需要的消耗类型不够则行动失败
        if (!G.FightUnitUtils.excute_unit_skill_consummer(fight_data, src_unit, consummer_type, consummer_value, skill_name)) {
            fight_data["战斗流程"].push({ "流程": 6, "战斗提示": { "内容": "行动失败", "编号": src_unit["编号"] } });
            return;
        }
    }


    if (!fight_data["PK战斗"] && src_unit["类型"] === "玩家") {
        src_unit["统计数据"]["施法"] += 1;
    }

    fight_data["战斗流程"].push({ "流程": 50, "攻击方": src_unit["编号"], "群封": false, "被攻击": [], "提示": { "允许": true, "类型": "法术", "名称": `${src_unit["名称"]}使用了${skill_name}` }, "技能提示": { "内容": `【群封】${skill_name}`, "编号": src_unit["编号"] } })
    fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["全屏"] = false;
    G.FightUtils.add_waiting_play_time(fight_data, 2, "群封技能");

    // 技能是否配置了必中
    let fengyin_success = skill_data["必中"] ? true : false;

    // 对所有目标执行算法
    for (let index = 0; index < target_list.length; index++) {
        let target = target_list[index];
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][index] = { "编号": target["编号"], "特效": [skill_name], "成功": false }
        //封印计算成功 并且目标没有处于封印状态则添加对应的封印状态
        if (!G.FightUnitUtils.get_unit_fengyin_status(target) &&
            (fengyin_success || get_unit_fengyin_success(fight_data, src_unit, target_unit, skill_name, skill_level))) {
            if (target_unit["法术状态"]["身似菩提"]) {
                fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["反弹"] = true;
                target_unit = src_unit;
            }
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, skill_name, skill_level);
        }
    }

}

/**
 * 单体封印技能计算
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} skill_name 
 */
export function computing_single_seal_skill(fight_data, src_unit, target_unit, skill_name, consummer = true) {
    console.debug(`单体封印技能计算 => 编号: ${src_unit["编号"]} 类型: ${src_unit["类型"]} 气血: ${src_unit["气血"]} 目标编号: ${target_unit["编号"] ? target_unit["编号"] : "无"} 技能：${skill_name}`);
    let skill_level = G.FightUnitUtils.get_unit_skill_level(src_unit, skill_name);
    if (G.FightUnitUtils.get_target_unit_status(src_unit, target_unit, 1)) {

        if (target_unit === undefined) {
            console.debug(`单体封印技能计算 => 目标单位不存在，跳过计算`);
            return;
        }

        if (target_unit["法术状态"] && target_unit["法术状态"]["分身术"] && target_unit["法术状态"]["分身术"]["破解"] === undefined) {
            target_unit["法术状态"]["分身术"]["破解"] = 1;
            console.debug(`单体封印技能计算 => 分身术破解，跳过计算`);
            return;
        }

        let skill_data = G.SkillData.default[skill_name];

        if (consummer) {
            // 获取技能消耗数据
            let consummer_value = 0;
            let consummer_type = "";
            if (skill_data && skill_data["消耗"]) {
                let res = skill_data["消耗"](fight_data, src_unit, 1);
                if (res) {
                    consummer_value = res[0];
                    consummer_type = res[1];
                }
            }
            // 如果需要的消耗类型不够则行动失败
            if (!G.FightUnitUtils.excute_unit_skill_consummer(fight_data, src_unit, consummer_type, consummer_value, skill_name)) {
                fight_data["战斗流程"].push({ "流程": 6, "战斗提示": { "内容": "行动失败", "编号": src_unit["编号"] } });
                return;
            }
        }

        if (!fight_data["PK战斗"] && target_unit["类型"] === "玩家") {
            src_unit["统计数据"]["施法"] += 1;
        }

        fight_data["战斗流程"].push({ "流程": 50, "攻击方": src_unit["编号"], "群封": false, "被攻击": [{ "编号": target_unit["编号"], "特效": [skill_name] }], "提示": { "允许": true, "类型": "法术", "名称": `${src_unit["名称"]}使用了${skill_name}` }, "技能提示": { "内容": `【单封】${skill_name}`, "编号": src_unit["编号"] } });
        G.FightUtils.add_waiting_play_time(fight_data, 2, "单封技能");

        if (!G.FightUnitUtils.get_unit_fengyin_status(target_unit) && get_unit_fengyin_success(fight_data, src_unit, target_unit, skill_name, src_unit["等级"])) {
            if (target_unit["法术状态"]["身似菩提"]) {
                fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["反弹"] = true;
                target_unit = src_unit;
            }
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, skill_name, skill_level);
        }
    }
    console.debug(`单体封印技能计算结束 => `);
}


/**
 * 计算是否封印成功 取封印成功
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @param {*} skill_name 技能
 */
export function get_unit_fengyin_success(fight_data, src_unit, target_unit, skill_name, skill_level) {

    // 目标的每回合毒掉血处理
    if (target_unit["门派"] === "女儿村") {
        if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "女儿村", "轻霜") && src_unit["法术状态"]["毒"] === undefined && G.RandomUtils.chance(30)) {
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "毒", G.FightUnitUtils.get_unit_skill_level(target_unit, "毒经"));
            src_unit["法术状态"]["毒"]["回合掉血"] = G.FightUnitUtils.get_unit_skill_level(target_unit, "毒经");
            src_unit["法术状态"]["毒"]["回合"] = 4;
        }
    }

    // 添加被封印发言 配置了被封发言就代表封印必中
    if (target_unit["被封发言"]) {
        fight_data["队伍数据"].forEach(team => {
            team.forEach(unit => {
                if (unit["类型"] === "角色") {
                    ClientUtils.send_characters_client_message(unit["id"], 5512, { "id": target_unit["编号"], "文本": target_unit["被封发言"] });
                }
            });
        });
        target_unit["被封发言"] = undefined;
        return true;
    }
    if (target_unit["被封必中"]) {
        return true;
    }
    if (target_unit["不可封印"]) {
        return false;
    }

    // 被攻击单位不可被封印的特殊状态
    for (const key in target_unit["特殊状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["不可封印"]) {
            console.debug(`不可封印 特殊状态 ${key}`)
            return false;
        }
    }

    // 不可被封印的状态
    if (target_unit["特殊状态"]["否定信仰"] ) {
        return false;
    }

    // 取技能算法
    let skill_data = G.SkillData.default[skill_name];
    if (skill_data["封印算法"]) {
        return skill_data["封印算法"](fight_data, src_unit, target_unit, skill_level);
    }
    return computing_fengyin_mz(fight_data, src_unit, target_unit, skill_name, skill_level);
}

/**
 * 封印命中计算
 */
export function computing_fengyin_mz(fight_data, src_unit, target_unit, skill_name, skill_level) {

    if (target_unit["门派"] === "无底洞") {
        if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "无底洞", "忍辱")) {
            G.FightUnitUtils.add_fen_nu(target_unit, 15);
        }
    }

    // 成功几率
    let fyjl = mzl(fight_data, src_unit, target_unit, skill_name, skill_level) + 10;

    if (target_unit["百无禁忌"]) {
        fyjl -= target_unit["百无禁忌"];
    }

    if (src_unit["封印命中等级"]) {
        fyjl += src_unit["封印命中等级"];
        //为玩家队伍增加封印命中
        if (!fight_data["PK战斗"] && src_unit["队伍"] !== 0) {
            fyjl += 10;
        }
    } else if (target_unit["抵抗封印等级"]) {
        fyjl -= target_unit["抵抗封印等级"];
    }

    if (G.RandomUtils.chance(fyjl)) {
        if (src_unit["法术状态"]["自矜"] && src_unit["奇经八脉"] && src_unit["奇经八脉"]["当前流派"] === "绝代妖娆") {
            if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "女儿村", "重明")) {
                if (G.RandomUtils.chance(50)) {
                    G.FightStatusUtils.canel_unit_status(fight_data, "自矜", src_unit) //单体封印
                }
            } else {
                G.FightStatusUtils.canel_unit_status(fight_data, "自矜", src_unit);
            }
        }
        if (src_unit["法术状态"]["顾盼生姿"]) {
            G.FightStatusUtils.canel_unit_status(fight_data, "顾盼生姿", src_unit);
        }

        if (target_unit["法术状态"]["身似菩提"]) {
            return true;
        }

        if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "盘丝洞", "迷梦") && !target_unit["法术状态"]["瘴气"] && G.RandomUtils.chance(60)) {
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "瘴气", 69);
        } else if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "盘丝洞", "迷梦") && !src_unit["法术状态"]["瘴气"] && G.RandomUtils.chance(60)) {
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "瘴气", 69);
        }

        if (src_unit["门派"] === "盘丝洞" && src_unit["奇经八脉"] && src_unit["奇经八脉"]["当前流派"] !== "百媚魔姝") {
            G.FightUnitUtils.add_fen_nu(src_unit, 4);
            if (target_unit["愤怒"]) {
                G.FightUnitUtils.remove_fen_nu(target_unit,4);
            }
        }
        return true;
    } else {
        if (skill_name !== "一笑倾城" && G.FightUnitUtils.check_fight_unit_passive_skill(src_unit, "自矜") && src_unit["奇经八脉"] && src_unit["奇经八脉"]["当前流派"] === "绝代妖娆") {
            let gl = 40;
            if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "女儿村", "独尊")) {
                gl = 100;
            }
            if (G.RandomUtils.chance(gl)) {
                G.FightStatusUtils.add_unit_status(fight_data, src_unit, src_unit, "自矜", 69);
            }
        }
        return false;
    }
}

/**
 * 计算封印技能命中率
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @param {*} skill_name 
 * @param {*} skill_level 
 * @returns 
 */
function mzl(fight_data, src_unit, target_unit, skill_name, skill_level) {

    // 封印等级
    let fy_level = skill_level;
    // 命中等级
    let mz_level = src_unit["封印命中等级"];
    let skill_data = G.SkillData.default[skill_name];
    if (src_unit["队伍"] !== 0) { //直接把怪的流程给排除

        if (src_unit["法术状态"]["顾盼生姿"]) {
            mz_level = mz_level + src_unit["法术状态"]["顾盼生姿"]["层数"] * src_unit["等级"] * 0.5;
        }
        // 技能封印等级算法
        if (skill_data["封印等级"]) {
            fy_level = skill_data["封印等级"](fight_data, src_unit, target_unit, skill_level, fy_level);
        }
        // 技能命中等级算法
        if (skill_data["命中等级"]) {
            mz_level = skill_data["命中等级"](fight_data, src_unit, target_unit, skill_level, mz_level);
        }
        if (src_unit["门派"] === "方寸山") {
            if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "方寸山", "制约")) {
                if (skill_name !== "催眠符") {
                    fy_level = fy_level + 15
                }
            }
            if (G.FightUnitUtils.check_fight_unit_passive_skill(src_unit, "奔雷")) {
                fy_level = fy_level - 15;
            }
        } else if (src_unit["门派"] === "女儿村") {
            if (src_unit["法术状态"]["自矜"]) {
                fy_level = fy_level + 48;
            }
            if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "女儿村", "毒雾") && G.RandomUtils.chance(30)) {
                G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "毒", 69);
            }
        } else if (src_unit["门派"] === "天宫") {
            if (src_unit["法术状态"]["趁虚"]) {
                fy_level = fy_level + 8
            }
        } else if (src_unit["门派"] === "阴曹地府") {
            if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "阴曹地府", "伤魂") && target_unit["法术状态"]["尸腐毒"]) {
                mz_level = mz_level + 200;
            }
        } else if (src_unit["门派"] === "五庄观") {
            if (src_unit["法术状态"]["心随意动"] && src_unit["法术状态"]["心随意动"]["经脉流派"] !== "乾坤力士") {
                mz_level = mz_level + src_unit["法术状态"]["心随意动"]["封印等级"]
            }

        } else if (src_unit["门派"] === "无底洞") {
            if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "无底洞", "萦魄") && src_unit["增益"] && src_unit["增益"] > 2) {
                mz_level = mz_level + Math.floor(src_unit["装备伤害"] * 0.15);
            }
        }
    }

    // 抵抗基础
    let dk_level = target_unit["等级"];
    // 抗封等级
    let kf_level = target_unit["抵抗封印等级"];

    // 技能抵抗等级算法
    if (skill_data["抵抗等级"]) {
        dk_level = skill_data["抵抗等级"](fight_data, src_unit, target_unit, skill_level, dk_level);
    }

    if (target_unit["门派"] === "大唐官府") {
        fy_level = fy_level - 10;
        if (target_unit["法术状态"]["干将莫邪"]) {
            if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "大唐官府", "干将") === false) {
                dk_level = dk_level + target_unit["法术状态"]["干将莫邪"]["境界"] * 5;
            } else if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "大唐官府", "神凝")) {
                dk_level = dk_level + target_unit["法术状态"]["干将莫邪"]["境界"] * 5 + 30;
            }
        }
    } else if (target_unit["门派"] === "龙宫" && G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "龙宫", "凛然")) {
        if (target_unit["法术状态"]["龙骇"]) {
            dk_level = dk_level + 80;
        }
        if (target_unit["法术状态"]["龙魂"]) {
            dk_level = dk_level + 80;
        }
    } else if (target_unit["门派"] === "方寸山") {
        if (target_unit["法术状态"]["凝神术"] && G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "方寸山", "专神")) {
            dk_level = dk_level + 4;
        }
        if (target_unit["神器"] && target_unit["神器"]["佩戴"] && target_unit["神器"]["名称"] === "金汤之固" && target_unit["气血"] < target_unit["最大气血"] * 0.3) {
            kf_level = kf_level + 240 * target_unit["神器"]["等级"];
        }
    } else if (target_unit["门派"] === "女儿村") {
        if (target_unit["神器"] && target_unit["神器"]["佩戴"] && target_unit["神器"]["名称"] === "盏中晴雪" && target_unit["速度"] > src_unit["速度"]) {
            kf_level = kf_level + (target_unit["速度"] - src_unit["速度"]) * 0.5 * target_unit["神器"]["等级"];
        }
    } else if (target_unit["门派"] === "化生寺") {
    } else if (target_unit["门派"] === "阴曹地府") {
        if (target_unit["法术状态"]["轮回"]) {
            kf_level = kf_level + 60;
        }
    }

    if (target_unit["法术状态"]["佛法无边"] && target_unit["法术状态"]["佛法无边"]["佛法"]) {
        dk_level = dk_level + 10;
    }
    if (target_unit["法术状态"]["花护"]) {
        dk_level = dk_level + 50;
    }
    if (target_unit["法术状态"]["清净"]) {
        dk_level = dk_level + 30;
    }

    //修炼差
    let xlc = Math.floor(src_unit["法术修炼"] * 150 / src_unit["等级"]) - Math.floor(target_unit["法术修炼"] * 150 / target_unit["等级"]);

    let mzjl = 40 + fy_level - dk_level + xlc + Math.floor(mz_level * 10 / (src_unit["等级"] + 25) - kf_level * 10 / (target_unit["等级"] + 25));

    // 技能命中几率算法
    if (skill_data["命中几率"]) {
        mzjl = skill_data["命中几率"](fight_data, src_unit, target_unit, skill_level, mzjl);
    }

    if (src_unit["门派"] === "女儿村") {

        if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "女儿村", "涂毒")) {
            mzjl -= 10;
        } else if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "女儿村", "杏花")) {
            mzjl -= 10;
        }
        if (src_unit["法术状态"]["淬芒"]) {
            mzjl += (src_unit["法术状态"]["淬芒"]["层数"] * 8)
        }
    } else if (src_unit["门派"] === "天宫") {
        if (G.FightUnitUtils.check_fight_unit_passive_skill(src_unit, "电芒")) {
            mzjl -= 15;
        }
    } else if (src_unit["门派"] === "盘丝洞") {
    } else if (src_unit["门派"] === "五庄观") {
    } else if (src_unit["门派"] === "无底洞") {
        if (G.FightUnitUtils.check_fight_unit_passive_skill(src_unit, "金莲")) {
            mzjl -= 30;
        }
    }
    if (target_unit["法术状态"]["空灵"]) {
        mzjl -= 14;
    }
    if (src_unit["法术状态"]["画地为牢"]) {
        mzjl -= 24;
    } else if (target_unit["法术状态"]["画地为牢"]) {
        mzjl += 18;
    }
    if (target_unit["静心"]) {
        mzjl -= 3;
    }

    if (target_unit["门派"] === "阴曹地府") {
        if (_SystemHourData["昼夜"] === 1) {
            mzjl = Math.floor(mzjl * 0.7);
        }
        if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "阴曹地府", "百爪狂杀")) {
            mzjl += 20;
        }
    } else if (target_unit["门派"] === "五庄观") {
        if (G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "五庄观", "三元") && target_unit["人参果"]["枚"] === 3) {
            mzjl -= 15;
        }
    } else if (target_unit["门派"] === "凌波城") {
        if (!G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "凌波城", "怒火")) {
            mzjl -= target_unit["战意"] * target_unit["战意"] / 2;
        }
    } else if (target_unit["门派"] === "花果山") {
        if (target_unit["法术状态"]["齐天神通"]) {
            mzjl -= 30;
        }
    } else if (target_unit["队伍"] !== 0 && target_unit["类型"] === "bb") {
        if (target_unit["内丹属性"]["慧心"]) {
            mzjl -= target_unit["内丹属性"]["慧心"]
        }
    } else if (target_unit["门派"] === "狮驼岭") {
        if (target_unit["法术状态"]["狂怒"] && target_unit["法术状态"]["狂怒"]["不羁"]) {
            mzjl -= 10;
        }
    } else if (target_unit["门派"] === "女儿村" && G.FightUnitUtils.check_fight_unit_jingmai(target_unit, "女儿村", "清澈") && target_unit["法术状态"]["自矜"]) {
        mzjl -= 10;
    }

    if (target_unit["法术状态"]["幽冥鬼眼"]) {
        mzjl -= 10;
        if (target_unit["法术状态"]["幽冥鬼眼"]["冥视"]) {
            mzjl -= 2;
        }
    }
    if (target_unit["合纵"]) {
        mzjl += 10;
    }

    if (src_unit["门派"] === "方寸山") {
        if (src_unit["法术状态"]["凝神术"]) {
            mzjl += 10;
        }
        if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "方寸山", "必果") && src_unit["等级"] >= target_unit["等级"] && src_unit["必果"] === undefined) {
            src_unit["必果"] = 1;
            mzjl = 100;
        }
    }
    return mzjl
}